Dify as MCP Server

by Yevanchen
Verified
MCP 调研 结论 1. MCP可以做为Dify工具体系的拓展,与Plugin成为工具中并列的两种类型(MCP作为生态的一部分,与插件并列) 2. Dify客户端可作为MCP Host,MCP Server可作为Dify中的工具 3. Dify工具可发布为MCP Server,在MCP Client中使用 MCP是什么 介绍 MCP(Model Context Protocol ) is an open protocol that standardizes how applications provide context to LLMs. MCP follows a client-server architecture where a host application can connect to multiple servers 简单来说,MCP是一个CS架构的协议,其目的是为了让模型能够获取到更多的环境信息(上下文)。 协议具体长啥样 [图片] 整体来说,MCP包括以下部分的内容: - MCP Hosts:想要通过MCP访问数据的程序,如Claude Desktop、IDE或AI工具 - MCP Clients:与服务器维持1:1连接的协议客户端 - MCP Servers:通过标准化的Model Context Protocol公开特定功能的轻量级程序 - Local Data Sources:MCP服务器可以安全访问的计算机文件、数据库和服务 - Remote Services:MCP服务器可以连接的通过互联网可用的外部系统(例如,通过API) 具体来说,一个MCP Client与一个MCP Server相连,通过MCP的传输协议来进行通信 [图片] 连接的生命周期 1. 连接初始化 [图片] 2. 信息交换 - Request-Response: Client发送Request,Server回复Response - Notifications: Client或者Server也都可以发送单向的信息 3. 断开连接 Client端和Server端都可以进行断开连接 - 客户端通过close()函数来断开连接 - 传输断开 - 产生错误 Server长啥样 根据Transport的类型不同,Server分为两类:Stdio transport和HTTP with SSE transport 1. Stdio transport 使用标准的输入输出进行通信,一般用于用于本地进程 常见的用例: Client: Claude客户端 Server: 脚本文件 使用: 1. 创建Server [图片] 2. 配置Server [图片] 3. 运行 [图片] 2. HTTP with SSE transport 使用HTTP POST方法来进行通信,Dify作为Client主要使用的方法 使用: 1. 前往https://mcp.composio.dev/notion/attractive-fresh-egypt-zkfePp获取Server地址 [图片] 2. 填写对应的Server,这里使用Cursor作为Client [图片] 3. 在Cursor Agent中使用 [图片] Client长啥样 Client只要能够遵循MCP的协议,能够与Server建立通信即可 常见的MCP Client - 客户端(Claude(只支持stdio server)、Cursor) - IDE插件(Cline、Continue) - 本地脚本(MCP示例中的聊天机器人) - Web应用(Dify?) Q&A Q: MCP与Agent的关系? Server可以做为Agent架构中的Tool进行使用,Client可以实现Agent的核心逻辑如Function Call、ReAct等。大部分Host只有Agent中可以使用Server,当然在Dify上我们也可以在Workflow中进行使用。 Q: 接入MCP,对Dify有什么好处? MCP是一个更大的生态,我们可以参与到这个生态中,可以让Dify的Workflow能够使用更多的工具。同时在Dify中的工作流/工具/应用,可以有更广泛的用途,可以不光只在Dify客户端中使用 Q: 其它产品是怎么接入MCP的? 1. Cursor作为MCP Client,可以连接SSE Server和Stdio Server [图片] 2. Claude作为MCP Client,但是只能连接Stdio Server [图片] 3. Composio作为Server的市场,对外提供Server [图片] MCP的后续功能规划 目前的MCP定义的内容还不够多,有些问题还是没有很好的解决,导致我们的产品形态会受限。这些预计在25年上半年会进行提供: 1. Server Auth,目前没有提供标准的鉴权协议,导致Auth都是由Server自己来实现的 2. Server分散,现在的Client是不能主动去找哪里有Server可进行连接的,只能自己去一家家的对,即缺少一个Marketplace 3. Stateless and short-lived connection,MCP现阶段是一个有状态,需要进行长连接的协议,如果这部分不进行修改,Dify作为Client就需要一个与Server保持长连接的网关,Dify导出的Server比较难去做Serveless的部署 https://modelcontextprotocol.io/development/roadmap MCP与Dify结合 整体架构 1. 工具目前支持Plugin、Workflow、Custom这三种,对于工具扩展,我们可以加入MCP类型 2. 由于目前的MCP协议中,都是长连接和有状态的,所以此处预计会设计一个网关服务(待讨论是否可以复用daemon服务) 3. 关于Server这部分,我们认为工具都可以导出为Server,即Plugin、Workflow、API Tool都可以作为Server导出,此处待验证 [图片] [图片] 用户旅程 Client端 暂时无法在飞书文档外展示此内容 Server端 目前我们可以通过Dify APP中的API加上一个wrapper导出为一个SSE Server 1. 我们导出一个工作流的API [图片] 2. 配置进Claude中 [图片] 3. 使用 [图片] 待讨论项 Dify作为MCP Client 存在的问题 - 🤔大量的Server是stdio形式的,在Dify中无法使用 - 🤔MCP Server目前缺少一个类似MarketPlace的地方,会不会存在用户不知道在哪找Server的问题 待决策 - ❓我们是否能复用Daemon服务作为MCP的Client网关 - ❓是否需要提供一个中继器,以让用户的Stdio Server转为SSE Server以在Dify中使用 Dify工具作为MCP Server 存在的问题 - 🤔MCP协议现在定义没有标准的鉴权形式,工具的鉴权都是由Server端实现的,我们是否可以参考Composio的设计,后续如果MCP提供了标准的鉴权协议后再接入 Composio的鉴权方式: [图片] [图片] 待决策 - ❓在SaaS版本中,工具作为Server导出后,如何限制使用量,防止被白嫖(是否应该是一个收费点) - ❓Servers的导出形式待验证,是导出一个SSE Server就够了?还是可以通过Docker或者JS/Python Pacakge等方式导出为一个Stdio Server - ❓Server导出的粒度?是APP还是工具,还是都可以 - ❓插件(Python Code)是否需要提供一个导出为Stdio Server的方法 相关材料 1. MCP协议:https://modelcontextprotocol.io/ 2. MCP Servers仓库:https://github.com/modelcontextprotocol/servers 3. Composio Servers: https://mcp.composio.dev/